import django_redis
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View

'''
图形验证码
前端： 
    拼接一个url给 img ，img会发请一个ajax请求
    url = https://<host>/image_codes/<uuid>/
后端：
    请求： 接受路由中的 uuid
    处理：生成图片验证码 和 图片的二进制，通过redis把图片验证码保存起来
    响应：返回图片二进制
    
    路由： GET image_codes/uuid/
    步骤：
        接受uuid
        生成图片验证码和图片二进制
        通过redis把图片验证码保存起来
        返回图片二进制
'''


class ImageCodeView(View):
    def get(self, request, uuid):
        # 接受uuid
        # 生成图片验证码和图片二进制
        from libs.captcha.captcha import captcha
        # text 是图片验证码的内容
        # image是图片的二进制
        text, image = captcha.generate_captcha()
        # 通过redis把图片验证码保存起来
        # redis的链接
        from django_redis import get_redis_connection
        redis_cli = get_redis_connection('code')
        # code是在settings.py中注册的，将数据保存在redis中的2号库中
        # 指令操作
        # 设置过期时间
        redis_cli.setex(uuid, 60, text)
        # 返回图片二进制,图片是二进制文本文件，不能返回json
        # content_type 响应体数据类型  的语法形式是: 大类/小类
        # 图片 image/jepg image/gif
        return HttpResponse(image, content_type='image/jpeg')


'''
前端：当用户输入完手机号 图形验证码 之后 前端发送一个ajax请求
    https://.../sms_codes/<phone_numbers>/?image_code&image_code_id/

后端：
    请求 获取请求参数 (路由手机号 ，用户的图形验证码和uuid在字符串中)
    业务逻辑：验证参数 验证图片验证码 生成短信验证码 保存短信验证码 发送短信验证码
    响应 ：发送响应 {'code':0,'errmsg:'ok'}
    
    路由：GET https://.../sms_codes/<phone_numbers>/?image_code&image_code_id/
步骤：
    1.获取请求参数
    2.验证参数
    3.验证图片验证码
    4.生成短信验证码
    5.保存短信验证码
    6.放松短信验证码
    7.返回响应
'''


class SmsCodeView(View):
    def get(self, request, mobile):
        print(mobile)
        # 1.获取请求参数
        image_code = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')
        # 2.验证参数
        if not all([mobile, image_code, uuid]):
            return JsonResponse({
                'code': 400,
                'errmsg': '参数不全',
            })
        # 3.验证图片验证码
        # 获取reedis中的数据进行比对
        redis_cli = django_redis.get_redis_connection('code')
        redis_image_code = redis_cli.get(uuid)
        # 图片验证码可能过期
        if redis_image_code is None:
            return JsonResponse({
                'code': 400,
                'errmsg': '验证码已过期',
            })
        if redis_image_code.decode().lower() != image_code.lower():
            return JsonResponse({
                'code': 400,
                'errmsg': '验证码错误',
            })
        # 提取发送短信的标记
        send_flag = redis_cli.get('send_flag_%s' % mobile)
        if send_flag is not None:
            return JsonResponse({'code': 400, 'errmsg': '请勿频繁注册'})
        # 4.生成短信验证码
        from random import randint
        sms_code = '%06d' % randint(0, 999999)
        # 管道 3 步
        # 新建管道
        pipeline = redis_cli.pipeline()
        pipeline.setex(mobile,300,sms_code)
        pipeline.setex('send_flag_%s' % mobile, 60, 1)
        pipeline.execute()
        # 管道收集指令
        # 管道执行指令
        # 5.保存短信验证码
        # redis_cli.setex(mobile, 300, sms_code)
        # # 添加一个发送标记,防止出现验证码轰炸
        # redis_cli.setex('send_flag_%s' % mobile, 60, 1)
        # 6.发送短信验证码
        from libs.yuntongxun.sms import CCP
        CCP().send_template_sms(mobile, [sms_code, 5], 1) # 一个标记位，占位用的。
        # 7.返回响应
        return JsonResponse({'code': 0, 'errmsg': 'ok'})
